package com.steven;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpApplication {

    public static void main(String[] args) {
        try {
            SpringApplication.run(SpApplication.class, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
/**
 *
 * @EnableAutoConfiguration： 借助@Import的支持，收集和注册特定场景相关的bean定义。将所有符合自动配置条件的bean定义加载到IoC容器
 *@SpringBootApplication  ->  EnableAutoConfiguration
 * ->  @Import(AutoConfigurationImportSelector.class)(实现了ImportSelector#selectImports())快速导入类
 * -> SpringFactoriesLoader.loadFactoryNames() -> 从META-INF/spring.factories获取配置文件
 * -> 反射实例化标注了@Configuration的JavaConfig形式的IoC容器配置类 然后汇总成一个加到IOC容器中
 *
 * springboot 自动装配原理
 * 过自定义实现ImportSelector接口，然后通过SpringFactoriesLoader扫描autoconfigure包下的
 * META-INF/spring.factories中所有路径下的类，并通过反射实例化成一个个的配置类并注入到Spring容器中，从而实现了自动装配
 *
 * run方法主要流程就是:
 * 1.获取监听器并启动:
 * 2.根据SpringApplication参数来准备环境
 * 3.Banner打印，在启动页面可以看到
 * 3.创建Spring容器，也就是代码中的context
 * 4.对前面生成的Spring容器做一些前置处理、刷新，后置处理等
 * 5.返回Spring context
 https://blog.csdn.net/u012389318/article/details/109741630?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
 *
 *
 */
